/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pe.edu.uch.syscom.hibernateSpringDao;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import org.hibernate.SQLQuery;
import org.hibernate.criterion.Restrictions;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import pe.edu.uch.syscom.managedbeans.uibeans.UIReporteBean;
import pe.edu.uch.syscom.mapping.TbReporte;
import pe.edu.uch.syscom.utils.ConstantesWeb;

/**
 *
 * @author USUARIO
 */
public class HSReporteDAOImpl extends HibernateDaoSupport implements HSReporteDAO {

    @Override
    public List<UIReporteBean> listarReporte( Calendar fInicio, Calendar fFin, int iIdUsuario, int iIdReporte ) {
        String sQuery;
        Calendar fFinAux =  Calendar.getInstance();
        SQLQuery sqlQuery;
        UIReporteBean uiRepBean;
        Object[] objFila;
        List lstRepTmp;
        List<UIReporteBean> lstUIRepo;
        lstUIRepo = new ArrayList<UIReporteBean>();

        switch ( iIdReporte ) {
            case ConstantesWeb.RPT_VENTAS_X_FECHA_Y_USUARIO:
                sQuery = "SELECT v.id_venta, sum(vd.precio_unidad) monto,sum(vd.cantidad) cantidad,v.fecha,"
                        + "IF(ISNULL(v.id_cliente),'NO DETERMINADO',CONCAT_WS(' ',c.ap_paterno,c.ap_materno,c.nombres)) cliente,"
                        + "u.usuario "
                        + "FROM tb_venta v "
                        + "INNER JOIN tb_venta_detalle vd ON(v.id_venta=vd.id_venta) "
                        + "INNER JOIN tb_usuario u ON(v.id_usuario=u.id_usuario) "
                        + "LEFT JOIN tb_cliente c ON(v.id_cliente=c.id_cliente)"
                        + "WHERE v.activo=1 AND vd.activo=1 AND u.activo=1 AND v.estado='006003' "
                        + "AND v.fecha BETWEEN ? AND ? AND u.id_usuario=?"
                        + " GROUP BY v.id_venta";
                fFinAux.setTime( fFin.getTime() );
                fFinAux.add( Calendar.DATE, 1 );
                sqlQuery = this.getSession().createSQLQuery( sQuery );
                sqlQuery.setDate( 0, fInicio.getTime() ).
                        setDate( 1, fFinAux.getTime() ).
                        setInteger( 2, iIdUsuario );

                lstRepTmp = sqlQuery.list();

                for ( Object objAux : lstRepTmp ) {
                    objFila = (Object[]) objAux;
                    uiRepBean = new UIReporteBean();
                    uiRepBean.setExpr1( objFila[0].toString() );//ID_VENTA
                    uiRepBean.setExpr2( objFila[1].toString() );//MONTO
                    uiRepBean.setExpr3( objFila[2].toString() );//CANTIDAD
                    uiRepBean.setExpr4( objFila[3].toString() );//FECHA DE VENTA
                    uiRepBean.setExpr5( objFila[4].toString() );//CLIENTE
                    uiRepBean.setExpr6( objFila[5].toString() );//USUARIO
                    lstUIRepo.add( uiRepBean );
                }

                break;
            case ConstantesWeb.RPT_VENTAS_X_FECHA_Y_PRODUCTO:
                sQuery = "SELECT  p.nombre,"
                        + "p.precio_venta,"
                        + "SUM(vd.cantidad) cant,"
                        + "SUM(p.precio_venta*vd.cantidad) m_est,"
                        + "SUM(vd.precio_unidad*vd.cantidad) m_rec,"
                        + "(SUM(p.precio_venta*vd.cantidad)-SUM(vd.precio_unidad * vd.cantidad) ) m_desc ,"
                        + "p.stock as stock "
                        + "FROM tb_producto p "
                        + "INNER JOIN tb_venta_detalle vd ON(p.id_producto=vd.id_producto) "
                        + "INNER JOIN tb_venta v ON(vd.id_venta=v.id_venta)"
                        + "WHERE v.activo=1 AND vd.activo=1 AND v.estado='006003' "
                        + "AND v.fecha BETWEEN ? AND ? AND p.activo=1 GROUP BY vd.id_producto";
                fFin.add( Calendar.DATE, 1 );
                sqlQuery = this.getSession().createSQLQuery( sQuery );
                sqlQuery.setDate( 0, fInicio.getTime() ).
                        setDate( 1, fFin.getTime() );
                try{ 
                    lstRepTmp = sqlQuery.list(); 
                }catch( Exception ex ){
                    lstRepTmp = new ArrayList();
                    System.out.println( "ERROR : " + ex.getMessage() );
                    ex.printStackTrace();
                }

                for ( Object objAux : lstRepTmp ) {
                    objFila = (Object[]) objAux;
                    uiRepBean = new UIReporteBean();
                    uiRepBean.setExpr1( objFila[0].toString() );//PRODUCTO
                    uiRepBean.setExpr2( objFila[1].toString() );//PRECIO VENTA
                    uiRepBean.setExpr3( objFila[2].toString() );//CANTIDAD
                    uiRepBean.setExpr4( objFila[3].toString() );//MONTO ESTIMADO
                    uiRepBean.setExpr5( objFila[4].toString() );//MONTO RECAUDADO
                    uiRepBean.setExpr6( objFila[5].toString() );//MONTO DESCONTADO
                    uiRepBean.setExpr7( objFila[6].toString() );//STOCK
                    lstUIRepo.add( uiRepBean );
                }

                break;
        }

        return lstUIRepo;
    }

    public TbReporte traerTbReportePorId( int iIdReporte ) {
        return (TbReporte) this.getSession().createCriteria( TbReporte.class ).add( Restrictions.eq( "idReporte", iIdReporte ) ).uniqueResult();
    }
}
